Current File : /var/www/e360ban/wp-content/plugins/wp-shortcodes-usuarios/integraciones/woocommerce.php |
<?php
/**
* Datos de WooCommerce
* copyright Enrique J. Ros - enrique@enriquejros.com
*
* @author Enrique J. Ros
* @link https://www.enriquejros.com
* @since 1.0.0
* @package WPShortcodesUsuarios
*
*/
defined ('ABSPATH') or exit;
Class WP_Shortcodes_Usuarios_WooCommerce {
public function __construct ($dato_shortcode, $user_id, $shortcode_id) {
$this->resultado = false;
switch ($dato_shortcode) {
/***************************************
* DATOS DE FACTURACIÓN DE WOOCOMMERCE *
***************************************/
case 'datos_facturacion_woo':
$cliente = new WC_Customer($user_id);
$estados = WC()->countries->get_states();
$this->resultado = sprintf ('%s %s<br>%s%s<br>%s%s<br>%s %s<br>%s (%s)',
$cliente->get_billing_first_name(),
$cliente->get_billing_last_name(),
$cliente->get_billing_company(),
($nif = get_user_meta ($user_id, 'nif', true)) ? '<br>' . $nif : '',
$cliente->get_billing_address_1(),
($dir2 = $cliente->get_billing_address_2()) ? '<br>' . $dir2 : '',
$cliente->get_billing_postcode(),
$cliente->get_billing_city(),
$estados[$pais = $cliente->get_billing_country()][$cliente->get_billing_state()],
WC()->countries->countries[$pais]
);
break;
case 'billing_first_name':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_billing_first_name();
break;
case 'billing_last_name':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_billing_last_name();
break;
case 'billing_company':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_billing_company();
break;
case 'billing_nif':
$this->resultado = get_user_meta ($user_id, 'nif', true);
break;
case 'billing_address_1':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_billing_address_1();
break;
case 'billing_address_2':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_billing_address_2();
break;
case 'billing_postcode':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_billing_postcode();
break;
case 'billing_city':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_billing_city();
break;
case 'billing_country':
$cliente = new WC_Customer($user_id);
$this->resultado = WC()->countries->countries[$cliente->get_billing_country()];
break;
case 'billing_state':
$cliente = new WC_Customer($user_id);
$estados = WC()->countries->get_states();
$this->resultado = $estados[$cliente->get_billing_country()][$cliente->get_billing_state()];
break;
case 'billing_phone':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_billing_phone();
break;
case 'billing_email':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_billing_email();
break;
/*********************************
* DATOS DE ENVÍO DE WOOCOMMERCE *
*********************************/
case 'datos_envio_woo':
$cliente = new WC_Customer($user_id);
$estados = WC()->countries->get_states();
$pais = $cliente->get_shipping_country() ? : $cliente->get_billing_country();
$state = $cliente->get_shipping_state() ? : $cliente->get_billing_state();
$this->resultado = sprintf ('%s %s<br>%s<br>%s%s<br>%s %s<br>%s (%s)',
$cliente->get_shipping_first_name() ? : $cliente->get_billing_first_name(),
$cliente->get_shipping_last_name() ? : $cliente->get_billing_last_name(),
$cliente->get_shipping_company() ? : $cliente->get_billing_company(),
($dir1s = $cliente->get_shipping_address_1()) ? $dir1s : $cliente->get_billing_address_1(),
($dir1s && $dir2s = $cliente->get_shipping_address_2()) ? '<br>' . $dir2s : (($dir2b = $cliente->get_billing_address_2()) ? '<br>' . $dir2b : ''),
$cliente->get_shipping_postcode() ? : $cliente->get_billing_postcode(),
$cliente->get_shipping_city() ? : $cliente->get_billing_city(),
isset ($estados[$pais][$state]) ? $estados[$pais][$state] : '',
WC()->countries->countries[$pais]
);
break;
case 'shipping_first_name':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_shipping_first_name();
break;
case 'shipping_last_name':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_shipping_last_name();
break;
case 'shipping_company':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_shipping_company();
break;
case 'shipping_address_1':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_shipping_address_1();
break;
case 'shipping_address_2':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_shipping_address_2();
break;
case 'shipping_postcode':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_shipping_postcode();
break;
case 'shipping_city':
$cliente = new WC_Customer($user_id);
$this->resultado = $cliente->get_shipping_city();
break;
case 'shipping_country':
$cliente = new WC_Customer($user_id);
$this->resultado = WC()->countries->countries[$cliente->get_shipping_country()];
break;
case 'shipping_state':
$cliente = new WC_Customer($user_id);
$estados = WC()->countries->get_states();
$this->resultado = $estados[$cliente->get_shipping_country()][$cliente->get_shipping_state()];
break;
/***********************************
* DATOS DE COMPRAS DE WOOCOMMERCE *
***********************************/
case 'productos_comprados':
$numero = get_field ('numero', $shortcode_id);
$quitar = apply_filters ('wp_shortcodes_usuarios_quita_estados', ['wc-refunded', 'wc-failed', 'wc-cancelled'], $shortcode_id);
$estados = wc_get_order_statuses();
/**
* Si no queremos que se incluya un estado de pedido concreto (por ejemplo, En espera):
*
* add_filter ('wp_shortcodes_usuarios_quita_estados', function ($estados) {
*
* $estados[] = 'wc-on-hold';
* return $estados;
* }, 10, 1);
*
*/
$pedidos = wc_get_orders (
array(
'customer_id' => $user_id,
'post_type' => wc_get_order_types(),
'post_status' => array_diff (array_keys ($estados), $quitar),
'numberposts' => -1,
)
);
if (!$pedidos)
break;
$novalidos = get_posts ( //Quitamos los que están en la papelera o como borrador
array(
'numberposts' => -1,
'meta_key' => '_customer_user',
'meta_value' => $user_id,
'post_type' => wc_get_order_types(),
'post_status' => ['trash', 'draft'],
)
);
$novalidos_ids = wp_list_pluck ($novalidos, 'ID');
foreach ($pedidos as $pedido)
if (!in_array ($pedido->get_id(), $novalidos_ids))
foreach ($pedido->get_items() as $item)
$ids[] = $item->get_product_id();
$ids = array_unique ($ids);
if ($numero && count ($ids) > $numero) //Si lo hacemos con limit en la query puede poner duplicados
$ids = array_slice ($ids, 0, $numero);
$this->resultado = do_shortcode (sprintf ('[products ids="%s"]', implode ($ids, ',')));
break;
case 'numero_pedidos_woo':
$quitar = apply_filters ('wp_shortcodes_usuarios_quita_estados', ['wc-refunded', 'wc-failed', 'wc-cancelled'], $shortcode_id);
$estados = wc_get_order_statuses();
/**
* Si no queremos que se incluya un estado de pedido concreto (por ejemplo, En espera):
*
* add_filter ('wp_shortcodes_usuarios_quita_estados', function ($estados) {
*
* $estados[] = 'wc-on-hold';
* return $estados;
* }, 10, 1);
*
*/
$pedidos = get_posts (
array(
'numberposts' => -1,
'meta_key' => '_customer_user',
'meta_value' => $user_id,
'post_type' => wc_get_order_types(),
'post_status' => array_diff (array_keys ($estados), $quitar),
)
);
$this->resultado = count ($pedidos);
break;
case 'total_gastado_woo':
$cantidad = wc_get_customer_total_spent ($user_id);
$formato = apply_filters ('wp_shortcodes_usuarios_formato_cantidad', true, $shortcode_id);
/**
* Si queremos obtener la cantidad numérica, sin formato:
*
* add_filter ('wp_shortcodes_usuarios_formato_cantidad', '__return_false');
*
*/
$this->resultado = $formato ? wc_price ($cantidad) : $cantidad;
break;
case 'pedido_minimo':
global $wp_roles;
$datos = get_userdata ($user_id);
$rol = $datos->roles[0];
$minimo = (($minimos = get_option ('ejr_minimos_pedido')) && isset ($minimos[$rol])) ? $minimos[$rol] : get_option ('ejr_minimo_' . $rol);
$cero = apply_filters ('wp_shortcodes_usuarios_sin_minimo', wc_price (0), $shortcode_id);
/**
* Para mostrar un texto cuando el rol del usuario no tiene mínimo de compra:
*
* add_filter ('wp_shortcodes_usuarios_sin_minimo', function ($texto) {
*
* return 'Texto a mostrar si no hay pedido mínimo';
* }, 10, 1);
*
*/
$this->resultado = $minimo ? wc_price ($minimo) : $cero;
break;
case 'tabla_pedidos':
$mensaje = sprintf ('<div class="woocommerce-message woocommerce-message--info woocommerce-Message woocommerce-Message--info woocommerce-info"><a class="woocommerce-Button button" href="%s">%s</a>No se ha hecho ningún pedido todavía.</div>', get_permalink (wc_get_page_id ('shop')), __('Browse products', 'woocommerce'), __('No order has been made yet.', 'woocommerce'));
$nopedidos = apply_filters ('wp_shortcodes_usuarios_no_pedidos', $mensaje, $shortcode_id);
/**
* Para mostrar un texto cuando el usuario no tiene pedidos:
*
* add_filter ('wp_shortcodes_usuarios_no_pedidos', function ($texto) {
*
* return 'Texto a mostrar si no hay pedidos';
* }, 10, 1);
*
*/
if (!$pedidos = get_posts (
array(
'numberposts' => -1,
'meta_key' => '_customer_user',
'meta_value' => $user_id,
'order_by' => 'date',
'order' => 'DESC',
'post_type' => wc_get_order_types(),
'post_status' => array_keys (wc_get_order_statuses()),
)
)) {
$this->resultado = $nopedidos;
break;
}
$this->resultado = sprintf ('<table class="woocommerce-orders-table woocommerce-MyAccount-orders shop_table shop_table_responsive my_account_orders account-orders-table wp-shortcodes-pedidos-tabla">
<thead>
<tr>
<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-number"><span class="nobr">%s</span></th>
<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-date"><span class="nobr">%s</span></th>
<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-status"><span class="nobr">%s</span></th>
<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-total"><span class="nobr">%s</span></th>
<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-actions"><span class="nobr">%s</span></th>
</tr>
</thead>
<tbody>', __('Order', 'woocommerce'), __('Date', 'woocommerce'), __('Status', 'woocommerce'), __('Total', 'woocommerce'), __('Actions', 'woocommerce'));
//Si usamos numberposts y ordenamos DESC salen los más antiguos
$limite = get_field ('numero', $shortcode_id);
if ($limite && count ($pedidos) > $limite)
$pedidos = array_slice ($pedidos, 0, $limite);
/**
* Si queremos que la lista esté ordenada con los más antiguos primero:
*
* add_filter ('wp_shortcodes_usuarios_pedidos_descendentes', '__return_true');
*
*/
if ($ordenar = apply_filters ('wp_shortcodes_usuarios_pedidos_descendentes', false, $shortcode_id))
$pedidos = array_reverse ($pedidos);
foreach ($pedidos as $pedido) {
$order = new WC_Order($pedido->ID);
$items = $order->get_item_count();
$acciones = '';
foreach (wc_get_account_orders_actions ($order) as $key => $accion)
$acciones .= sprintf ('<a href="%s" class="woocommerce-button button %s">%s</a>', $accion['url'], $key, $accion['name']);
$this->resultado .= sprintf ('
<tr class="woocommerce-orders-table__row order">
<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-number" data-title="%s">
<a href="%s">#%s</a>
</td>
<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-date" data-title="%s">
<time datetime="%s">%s</time>
</td>
<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-status" data-title="%s">%s</td>
<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-total" data-title="%s">%s</td>
<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-actions" data-title="%s">%s</td>
</tr>',
__('Order', 'woocommerce'),
$order->get_view_order_url(),
$pedido->ID,
__('Date', 'woocommerce'),
$pedido->post_date,
date_i18n (get_option ('date_format'), strtotime ($pedido->post_date)),
__('Status', 'woocommerce'),
wc_get_order_status_name ($order->get_status()),
__('Total', 'woocommerce'),
sprintf (_n('%1$s for %2$s item', '%1$s for %2$s items', $items, 'woocommerce'), wc_price ($order->get_total()), $items),
__('Actions', 'woocommerce'),
$acciones
);
}
$this->resultado .= '</tbody></table>';
break;
case 'tabla_descargas':
$aviso = sprintf ('<div class="woocommerce-Message woocommerce-Message--info woocommerce-info"><a class="woocommerce-Button button" href="%s">%s</a>%s</div>', get_permalink (wc_get_page_id ('shop')), __('Browse products', 'woocommerce'), __('No downloads available yet.', 'woocommerce'));
$nodescargas = apply_filters ('wp_shortcodes_usuarios_no_descargas', $aviso, $shortcode_id);
/**
* Para mostrar un texto cuando no hay descargas para el usuario:
*
* add_filter ('wp_shortcodes_usuarios_no_descargas', function ($texto) {
*
* return 'Texto a mostrar si no hay descargas';
* }, 10, 1);
*
*/
if (!$descargas = wc_get_customer_available_downloads ($user_id)) {
$this->resultado = $nodescargas;
break;
}
$this->resultado = sprintf ('<table class="woocommerce-table woocommerce-table--order-downloads shop_table shop_table_responsive order_details wp-shortcodes-descargas-tabla">
<thead>
<tr>
<th class="download-product"><span class="nobr">%s</span></th>
<th class="download-remaining"><span class="nobr">%s</span></th>
<th class="download-expires"><span class="nobr">%s</span></th>
<th class="download-file"><span class="nobr">%s</span></th>
</tr>
</thead>
<tbody>', __('Product', 'woocommerce'), __('Downloads remaining', 'woocommerce'), __('Expires', 'woocommerce'), __('Download', 'woocommerce'));
foreach ($descargas as $descarga)
$this->resultado .= sprintf ('
<tr>
<td class="download-product wp-shortcodes-descarga-producto" data-title="%s">
<a href="%s">%s</a>
</td>
<td class="download-remaining wp-shortcodes-descarga-restantes" data-title="%s">%s</td>
<td class="download-expires wp-shortcodes-descarga-expira" data-title="%s">%s</td>
<td class="download-file wp-shortcodes-descarga-archivo" data-title="%s">
<a href="%s" class="woocommerce-MyAccount-downloads-file button alt wp-shortcodes-descarga-boton">%s</a>
</td>
</tr>',
__('Product', 'woocommerce'),
$descarga['product_url'],
$descarga['product_name'],
__('Downloads remaining', 'woocommerce'),
$descarga['downloads_remaining'] ? : '∞',
__('Expires', 'woocommerce'),
isset ($descarga['access_expires']) ? date_i18n (get_option ('date_format'), strtotime ($descarga['access_expires'])) : __('Never', 'woocommerce'),
__('Download', 'woocommerce'),
$descarga['download_url'],
$descarga['download_name']
);
$this->resultado .= '</tbody></table>';
break;
case 'tabla_cupones':
global $wpdb;
$datos = get_userdata ($user_id);
$query = "SELECT {$wpdb->prefix}postmeta.post_id FROM {$wpdb->prefix}postmeta WHERE {$wpdb->prefix}postmeta.meta_key LIKE 'customer_email' AND {$wpdb->prefix}postmeta.meta_value LIKE '%{$datos->user_email}%'";
$nocupones = apply_filters ('wp_shortcodes_usuarios_no_cupones', false, $shortcode_id);
/**
* Para mostrar un texto cuando no hay cupones específicos para el usuario:
*
* add_filter ('wp_shortcodes_usuarios_no_cupones', function ($texto) {
*
* return 'Texto a mostrar si no hay cupones';
* }, 10, 1);
*
*/
if (!$cupones = $wpdb->get_results($query)) {
$this->resultado = $nocupones;
break;
}
$this->resultado = sprintf ('<table class="woocommerce-table woocommerce-table--order-downloads shop_table shop_table_responsive order_details wp-shortcodes-cupones-tabla">
<thead>
<tr>
<th class="wp-shortcodes-cupones-codigo"><span class="nobr">%s</span></th>
<th class="wp-shortcodes-cupones-descripcion"><span class="nobr">%s</span></th>
<th class="wp-shortcodes-cupones-descuento"><span class="nobr">%s</span></th>
<th class="wp-shortcodes-cupones-usos"><span class="nobr">%s</span></th>
</tr>
</thead>
<tbody>', __('Code', 'woocommerce'), __('Description', 'woocommerce'), __('Descuento', 'wp-shortcodes-usuario'), __('Usos restantes', 'wp-shortcodes-usuario'));
foreach ($cupones as $cupon) {
$cantidad = get_post_meta ($cupon->post_id, 'coupon_amount', true);
if ('fixed_cart' == ($tipo = get_post_meta ($cupon->post_id, 'discount_type', true)) || 'fixed_product' == $tipo)
$descuento = wc_price ($cantidad);
else if ('percent' == $tipo)
$descuento = $cantidad . '%';
$limite_cupon = get_post_meta ($cupon->post_id, 'usage_limit', true) ? : 0;
$limite_usuario = get_post_meta ($cupon->post_id, 'usage_limit_per_user', true) ? : 0;
$limite = ($limite_cupon || $limite_usuario) ? min ([$limite_cupon, $limite_usuario]) - get_post_meta ($cupon->post_id, 'usage_count', true) : '∞';
$post = get_post ($cupon->post_id);
$this->resultado .= sprintf ('
<tr>
<td class="wp-shortcodes-cupones-codigo" data-title="%s">%s</td>
<td class="wp-shortcodes-cupones-restantes" data-title="%s">%s</td>
<td class="wp-shortcodes-cupones-expira" data-title="%s">%s</td>
<td class="wp-shortcodes-cupones-archivo" data-title="%s">%s</td>
</tr>',
__('Code', 'woocommerce'),
$post->post_title,
__('Description', 'woocommerce'),
$post->post_excerpt,
__('Descuento', 'wp-shortcodes-usuario'),
$descuento,
__('Usos restantes', 'wp-shortcodes-usuario'),
$limite
);
}
$this->resultado .= '</tbody></table>';
break;
}
return $this->resultado;
}
}